iT邦幫忙

2022 iThome 鐵人賽

DAY 6
0
Modern Web

用 Node.js 打造後端 API系列 第 6

Day 06 - 進階搜尋結果2

  • 分享至 

  • xImage
  •  

前言


昨天我們用了filtering來搜尋符合在req.query中的key value pair的bootcamp資料
但有時候使用者只希望得到bootcamp幾個比較重要的資料像是name, description等
我們就能利用select來完成這項功能~
除此之外,今天還會介紹如何將搜尋結果排列(sort)

Select


一樣在'./controllers/bootcamps'中,找到getBootcamps函式

// 複製原來的req.query
const reqQuery = { ...req.query };
    
// 要從req.query移除的key
const removeFields = ['select'];

// Loop over removeFields 並將它們從reqQuery刪掉
removeFields.forEach(param => delete reqQuery[param]);

一開始先複製req.query的用意為,我們要把select這個字作為選取bootcamp指定key value pair的關鍵字
所以要將select從req.query剔除掉,不然MongoDB會把select作為其中一個key在資料庫中搜尋符合的資料欄位
因此,reqQuery複製了不包含select的req.query(在第三行被剔除掉)
昨天提到的queryStr也要改成

let queryStr = JSON.stringify(reqQuery);

由於mongoose的Model.select()傳入的值為彼此間有空格的字串像'name description'
所以當req.query有select這個key時,我們要將value轉化成name description這樣中間空一格的形式

// Select fields
if (req.query.select) {
  const fields = req.query.select.split(',').join(' ');
  query = query.select(fields);
}

回傳結果如下:
https://ithelp.ithome.com.tw/upload/images/20220914/20151654jaJwiLxOuj.png

Sort


搜尋結果的排列用到的方法,與select是一樣的
只要在removeFields後面加上sort就好

// Sort
if (req.query.sort) {
  const sortBy = req.query.sort.split(',').join(' ');
  query = query.sort(sortBy);
} else {
  query = query.sort('-createdAt');
}

回傳結果如下:
https://ithelp.ithome.com.tw/upload/images/20220914/20151654PM2GNiDeC1.png

明天會講pagination, 敬請期待~


上一篇
Day 05 - 進階搜尋結果
下一篇
Day 07 - 進階搜尋結果3
系列文
用 Node.js 打造後端 API30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言